package com.sromku.bugsnag.dialog;
import java.util.ArrayList;
import java.util.Collections;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ICheckStateProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import com.sromku.bugsnag.model.Column;
import com.sromku.bugsnag.model.ColumnInfo;
import com.sromku.bugsnag.preferences.PreferencesManager;
import com.sromku.bugsnag.providers.TableContentProvider;
import com.sromku.bugsnag.providers.ColumnsLabelProvider;
public class ConfigureColumnsDialog extends TitleAreaDialog {
private CheckboxTableViewer table;
private Button upButton;
private Button downButton;
private Text widthText;
public ConfigureColumnsDialog(Shell parentShell) {
super(parentShell);
}
@Override
public void create() {
super.create();
setTitle("Configure columns...");
setMessage("Select and arrange the columns you want to see in the view");
}
public void setInput() {
ArrayList<ColumnInfo> values = PreferencesManager.getSelectedColumns();
table.setInput(values.toArray());
}
@Override
protected Control createDialogArea(Composite parent) {
Composite area = (Composite) super.createDialogArea(parent);
Composite container = new Composite(area, SWT.NONE);
container.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
// set internal layout
container.setLayout(new FormLayout());
// set the table to the left
setTable(container);
// set all buttons to the right
setButtons(container);
// set column width
setWidth(container);
// set data
table.setContentProvider(new TableContentProvider());
table.setLabelProvider(new ColumnsLabelProvider());
// set checked state
table.setCheckStateProvider(new ICheckStateProvider() {
@Override
public boolean isGrayed(Object element) {
return false;
}
@Override
public boolean isChecked(Object element) {
ColumnInfo columnInfo = (ColumnInfo) element;
return columnInfo.selected;
}
});
// listen to changes
table.addCheckStateListener(new ICheckStateListener() {
@Override
public void checkStateChanged(CheckStateChangedEvent event) {
ColumnInfo columnInfo = (ColumnInfo) event.getElement();
columnInfo.selected = event.getChecked();
PreferencesManager.updateSelectedColumn(columnInfo);
setInput();
}
});
// add selection listener
table.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
StructuredSelection selection = (StructuredSelection) event.getSelection();
if (!selection.isEmpty()) {
ColumnInfo columnInfo = (ColumnInfo) selection.getFirstElement();
int index = PreferencesManager.getSelectedColumns().indexOf(columnInfo);
if (index == 0) {
setButtonEnabled(upButton, false);
setButtonEnabled(downButton, true);
} else if (index == Column.values().length - 1) {
setButtonEnabled(upButton, true);
setButtonEnabled(downButton, false);
} else {
setButtonEnabled(upButton, true);
setButtonEnabled(downButton, true);
}
widthText.setEnabled(true);
widthText.setText(String.valueOf(columnInfo.width));
} else {
setButtonEnabled(upButton, false);
setButtonEnabled(downButton, false);
widthText.setEnabled(false);
widthText.setText("");
}
}
});
setInput();
return area;
}
private void setButtonEnabled(Button button, boolean isEnabled) {
button.setEnabled(isEnabled);
}
private void setTable(Composite parent) {
table = CheckboxTableViewer.newCheckList(parent, SWT.MULTI | SWT.V_SCROLL | SWT.BORDER);
FormData formData = new FormData();
formData.bottom = new FormAttachment(100, -35);
formData.top = new FormAttachment(0, 10);
formData.right = new FormAttachment(65, 0);
formData.left = new FormAttachment(0, 10);
table.getTable().setLayoutData(formData);
}
private Composite setButtons(Composite parent) {
Composite buttons = new Composite(parent, SWT.NONE);
FormData buttonsFormData = new FormData();
buttonsFormData.top = new FormAttachment(0, 10);
buttonsFormData.right = new FormAttachment(100, -10);
buttonsFormData.left = new FormAttachment(table.getTable(), 10);
buttons.setLayoutData(buttonsFormData);
// set composite layout
buttons.setLayout(new FormLayout());
// set up button
upButton = new Button(buttons, SWT.NONE);
upButton.setText("Up");
upButton.setEnabled(false);
setButtonLayoutData(upButton, null);
// add selection listener
upButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
StructuredSelection structuredSelection = (StructuredSelection) table.getSelection();
if (structuredSelection != null && !structuredSelection.isEmpty()) {
ColumnInfo columnInfo = (ColumnInfo) structuredSelection.getFirstElement();
ArrayList<ColumnInfo> selectedColumns = PreferencesManager.getSelectedColumns();
int index = selectedColumns.indexOf(columnInfo);
if (index - 1 >= 0) {
Collections.swap(selectedColumns, index, index - 1);
PreferencesManager.updateSelectedColumns(selectedColumns);
setInput();
}
}
}
});
// set down button
downButton = new Button(buttons, SWT.NONE);
downButton.setText("Down");
downButton.setEnabled(false);
// add selection listener
downButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
StructuredSelection structuredSelection = (StructuredSelection) table.getSelection();
if (structuredSelection != null && !structuredSelection.isEmpty()) {
ColumnInfo columnInfo = (ColumnInfo) structuredSelection.getFirstElement();
ArrayList<ColumnInfo> selectedColumns = PreferencesManager.getSelectedColumns();
int index = selectedColumns.indexOf(columnInfo);
if (index + 1 < selectedColumns.size()) {
Collections.swap(selectedColumns, index, index + 1);
PreferencesManager.updateSelectedColumns(selectedColumns);
setInput();
}
}
}
});
setButtonLayoutData(downButton, upButton);
return buttons;
}
private void setWidth(Composite container) {
Composite composite = new Composite(container, SWT.NONE);
FormData formData = new FormData();
formData.top = new FormAttachment(table.getTable(), 10);
formData.right = new FormAttachment(65, 0);
formData.left = new FormAttachment(0, 10);
formData.bottom = new FormAttachment(100, 0);
composite.setLayoutData(formData);
// set layout
composite.setLayout(new FormLayout());
// set label
Label label = new Label(composite, SWT.NONE);
label.setText("Column width:");
FormData labelFormData = new FormData();
labelFormData.top = new FormAttachment(0, 0);
labelFormData.left = new FormAttachment(0, 0);
label.setLayoutData(labelFormData);
// set input
widthText = new Text(composite, SWT.BORDER);
FormData widthFormData = new FormData();
widthFormData.width = 50;
widthFormData.top = new FormAttachment(0, 0);
widthFormData.right = new FormAttachment(100, 0);
widthText.setLayoutData(widthFormData);
widthText.setEnabled(false);
// verify numbers only
widthText.addListener(SWT.Verify, new Listener() {
public void handleEvent(Event e) {
if (e.text == null || e.text.length() == 0) {
return;
}
try {
Integer.parseInt(e.text);
}
catch (NumberFormatException ex) {
e.doit = false;
return;
}
}
});
// modify listener
widthText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
String string = widthText.getText();
if (string != null && string.length() > 0) {
try {
int width = Integer.parseInt(string);
StructuredSelection selection = (StructuredSelection) table.getSelection();
if (selection != null && !selection.isEmpty()) {
ColumnInfo columnInfo = (ColumnInfo) selection.getFirstElement();
columnInfo.width = width;
PreferencesManager.updateSelectedColumn(columnInfo);
}
}
catch (NumberFormatException ex) {
return;
}
}
}
});
}
private void setButtonLayoutData(Button button, Button relative) {
FormData formData = new FormData();
if (relative == null) {
formData.top = new FormAttachment(0, 10);
} else {
formData.top = new FormAttachment(relative, 5);
}
formData.right = new FormAttachment(100, 0);
formData.left = new FormAttachment(0, 0);
button.setLayoutData(formData);
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
createButton(parent, IDialogConstants.OK_ID, "Close", true);
}
@Override
protected boolean isResizable() {
return true;
}
@Override
protected Point getInitialSize() {
return new Point(300, 400);
}
@Override
protected void okPressed() {
super.okPressed();
}
}